lib/sign: add ostree_seign_clear_keys function
authorDenis Pynkin <denis.pynkin@collabora.com>
Sun, 27 Oct 2019 19:45:48 +0000 (19:45 +0000)
committerDenis Pynkin <denis.pynkin@collabora.com>
Wed, 25 Mar 2020 12:23:54 +0000 (15:23 +0300)
Add the function for implicit cleanup of all loaded keys.

Signed-off-by: Denis Pynkin <denis.pynkin@collabora.com>
apidoc/ostree-sections.txt
src/libostree/libostree-devel.sym
src/libostree/ostree-sign-ed25519.c
src/libostree/ostree-sign-ed25519.h
src/libostree/ostree-sign.c
src/libostree/ostree-sign.h

index 440338c237e617d8235c53890abee12c018f58e6..9b71d610f2e6be8beaa8e395c65180ce5f4a56b1 100644 (file)
@@ -719,6 +719,7 @@ ostree_sign_data_verify
 ostree_sign_get_by_name
 ostree_sign_get_name
 ostree_sign_add_pk
+ostree_sign_clear_keys
 ostree_sign_load_pk
 ostree_sign_set_pk
 ostree_sign_set_sk
index 3ca8f2c628d68d18b969bf7a398f2ade825e2b54..a10ec266484f7a924f511b0eebcef1faa59b59e1 100644 (file)
@@ -30,6 +30,7 @@ global:
   ostree_sign_data_verify;
   ostree_sign_get_by_name;
   ostree_sign_get_name;
+  ostree_sign_clear_keys;
   ostree_sign_load_pk;
   ostree_sign_set_pk;
   ostree_sign_add_pk;
index 662521b979c0bb2166c5367ebd56ac7fa63decaa..f61c3bdd503a4b2a5cd939bc12f05b93a36406b2 100644 (file)
@@ -62,6 +62,7 @@ ostree_sign_ed25519_iface_init (OstreeSignInterface *self)
   self->get_name = ostree_sign_ed25519_get_name;
   self->metadata_key = ostree_sign_ed25519_metadata_key;
   self->metadata_format = ostree_sign_ed25519_metadata_format;
+  self->clear_keys = ostree_sign_ed25519_clear_keys;
   self->set_sk = ostree_sign_ed25519_set_sk;
   self->set_pk = ostree_sign_ed25519_set_pk;
   self->add_pk = ostree_sign_ed25519_add_pk;
@@ -253,6 +254,36 @@ const gchar * ostree_sign_ed25519_metadata_format (OstreeSign *self)
   return OSTREE_SIGN_METADATA_ED25519_TYPE;
 }
 
+gboolean ostree_sign_ed25519_clear_keys (OstreeSign *self,
+                                         GError **error)
+{
+  g_debug ("%s enter", __FUNCTION__);
+  g_return_val_if_fail (OSTREE_IS_SIGN (self), FALSE);
+
+#ifdef HAVE_LIBSODIUM
+  OstreeSignEd25519 *sign = ostree_sign_ed25519_get_instance_private(OSTREE_SIGN_ED25519(self));
+
+  /* Clear secret key */
+  if (sign->secret_key != NULL)
+  {
+    memset (sign->secret_key, 0, crypto_sign_SECRETKEYBYTES);
+    g_free (sign->secret_key);
+    sign->secret_key = NULL;
+  }
+
+  /* Clear already loaded trusted keys */
+  if (sign->public_keys != NULL)
+    {
+      g_list_free_full (sign->public_keys, g_free);
+      sign->public_keys = NULL;
+    }
+
+  return TRUE;
+
+#endif /* HAVE_LIBSODIUM */
+  return FALSE;
+}
+
 /* Support 2 representations:
  * base64 ascii -- secret key is passed as string
  * raw key -- key is passed as bytes array
@@ -267,7 +298,7 @@ gboolean ostree_sign_ed25519_set_sk (OstreeSign *self,
 #ifdef HAVE_LIBSODIUM
   OstreeSignEd25519 *sign = ostree_sign_ed25519_get_instance_private(OSTREE_SIGN_ED25519(self));
 
-  g_free (sign->secret_key);
+  ostree_sign_ed25519_clear_keys (self, error);
 
   gsize n_elements = 0;
 
@@ -315,12 +346,7 @@ gboolean ostree_sign_ed25519_set_pk (OstreeSign *self,
 
   OstreeSignEd25519 *sign = ostree_sign_ed25519_get_instance_private(OSTREE_SIGN_ED25519(self));
 
-  /* Substitute the key(s) with a new one */
-  if (sign->public_keys != NULL)
-    {
-      g_list_free_full (sign->public_keys, g_free);
-      sign->public_keys = NULL;
-    }
+  ostree_sign_ed25519_clear_keys (self, error);
 
   return ostree_sign_ed25519_add_pk (self, public_key, error);
 }
index 4519961d568fba438fce717b9ffb1a6db6fb39bb..bced1cdfc8e17ea4e0ebda270ffb01a32ef2b5b4 100644 (file)
@@ -55,6 +55,9 @@ const gchar * ostree_sign_ed25519_get_name (OstreeSign *self);
 const gchar * ostree_sign_ed25519_metadata_key (OstreeSign *self);
 const gchar * ostree_sign_ed25519_metadata_format (OstreeSign *self);
 
+gboolean ostree_sign_ed25519_clear_keys (OstreeSign *self,
+                                         GError **error);
+
 gboolean ostree_sign_ed25519_set_sk (OstreeSign *self,
                                      GVariant *secret_key,
                                      GError **error);
index b19752152bfab27200a6f222a7f50f2bbb826e62..e5d55ef21de71d4534a4caf07930192f5ad704ad 100644 (file)
@@ -87,6 +87,17 @@ const gchar * ostree_sign_metadata_format (OstreeSign *self)
   return OSTREE_SIGN_GET_IFACE (self)->metadata_format (self);
 }
 
+gboolean ostree_sign_clear_keys (OstreeSign *self,
+                                 GError **error)
+{
+  g_debug ("%s enter", __FUNCTION__);
+
+  if (OSTREE_SIGN_GET_IFACE (self)->clear_keys == NULL)
+    return TRUE;
+
+  return OSTREE_SIGN_GET_IFACE (self)->clear_keys (self, error);
+}
+
 gboolean ostree_sign_set_sk (OstreeSign *self,
                              GVariant *secret_key,
                              GError **error)
index 008c3f9d3f3138ee6b116d9c02062fffa9111fed..9add0450f8272a70e2b789b8ccac549b20ced9a5 100644 (file)
@@ -59,6 +59,8 @@ struct _OstreeSignInterface
                             GError **error);
   const gchar *(* metadata_key) (OstreeSign *self);
   const gchar *(* metadata_format) (OstreeSign *self);
+  gboolean (* clear_keys) (OstreeSign *self,
+                           GError **error);
   gboolean (* set_sk) (OstreeSign *self,
                        GVariant *secret_key,
                        GError **error);
@@ -109,6 +111,10 @@ gboolean ostree_sign_commit_verify (OstreeSign *self,
                                     GCancellable   *cancellable,
                                     GError         **error);
 
+_OSTREE_PUBLIC
+gboolean ostree_sign_clear_keys (OstreeSign *self,
+                                 GError **error);
+
 _OSTREE_PUBLIC
 gboolean ostree_sign_set_sk (OstreeSign *self,
                              GVariant *secret_key,